//
//  circlelist.h
//  循环链表的设计与实现
//
//  Created by ZJ on 2018/7/13.
//  Copyright © 2018年 iCatch Technology Inc. All rights reserved.
//

#ifndef circlelist_h
#define circlelist_h

#include <stdio.h>

typedef void     CircleList;
typedef struct _tag_CircleListNode {
    struct _tag_CircleListNode *next;
} CircleListNode;


/**
 创建一个循环链表

 @return 返回循环链表的首地址
 */
CircleList* CircleList_Create(void);

/**
 销毁循环链表

 @param list 循环链表首地址
 */
void CircleList_Destroy(CircleList *list);

/**
 清空循环链表

 @param list 循环链表首地址
 */
void CircleList_Clear(CircleList *list);

/**
 求循环链表长度

 @param list 循环链表首地址
 @return 循环链表长度
 */
int CircleList_Length(CircleList *list);

/**
 向循环链表中插入一个 node

 @param list 循环链表首地址
 @param node 要插入的节点
 @param pos 要插入的位置
 @return 0 表示成功，非0 失败
 */
int CircleList_Insert(CircleList *list, CircleListNode *node, int pos);

/**
 获取循环链表中某位置的节点元素

 @param list 循环链表首地址
 @param pos 获取的位置
 @return 节点
 */
CircleListNode* Circle_Get(CircleList* list, int pos);

/**
 删除循环链表中某位置的节点元素

 @param list 循环链表首地址
 @param pos 删除节点的位置
 @return 删除的节点
 */
CircleListNode* Circle_Delete(CircleList *list, int pos);

// add

/**
 删除循环链表中的某个元素

 @param list 循环链表首地址
 @param node 要删除的节点
 @return 删出的节点元素
 */
CircleListNode* CircleList_DeleteNode(CircleList *list, CircleListNode *node);

/**
 重置循环链表

 @param list 循环链表首地址
 @return null
 */
CircleListNode* CircleList_Reset(CircleList *list);

/**
 获取循环链表中游标所指的节点

 @param list 循环链表首地址
 @return 节点 node
 */
CircleListNode* CircleList_Current(CircleList *list);

/**
 获取循环链表中游标下一位置的节点元素

 @param list 循环链表首地址
 @return 下一位置的节点元素
 */
CircleListNode* CircleList_Next(CircleList *list);

#endif /* circlelist_h */
